/*                      Programa PRIMOS.C                       */
/*                                                              */
/*      Executar:                                               */
/*      $ primos fit1 fit2 fit3 ...                             */
/*      busca els numeros primers que hi han dins els fitxers   */
/*      (de text, un numero per fila) que es passen per para-   */
/*      metre (maxim 10 fitxers).                               */

#include <stdio.h>


/* retorna CERT (diferent de zero) si el numero que es passa per parametre */
/* es primer */
int primer(int num)
{
    int div,j;

    if (num <= 0) div = !0;		/* filtra numeros negatius */
    else
    {	j = 1; div = 0;			/* per defecte, num no es divisible */
	while ((j < num/2) && (!div))	/* mentre no divisible i no arribem */
	{				/* al divisor maxim (num/2) */
	    j++;				/* passem al seguent divisor */
	    div = ((num % j) == 0);		/* detectem si es pot dividir */
	}
    }
    return(!div);			/* es primer si no es divisible */
}

/* busca els numeros primers que hi ha al fitxer que es passa per    */
/* parametre (els imprimeix per pantalla i retorna el numero total   */
/* de primers que s'han trobat al fitxer). */
int f_primers(char *nom_fitxer)
{
    char linia[80];
    int i,n,numero;
    FILE *fit;

    fit = fopen(nom_fitxer, "rt");	/* intenta obrir fitxer per lectura */
    if (!fit)
    {	fprintf(stderr, "Error : no puc obrir el fitxer \"%s\"\n",nom_fitxer);
	n = -1;				/* no hi han numeros */
    }
    else
    {	n = 0;
	while (!feof(fit))		/* mentre no final de fitxer */
	{
	    fgets(linia,80,fit);	/* llegir numero decimal del fitxer */
	    numero = atoi(linia);
	    if (primer(numero))
	    {	printf("\"%s\" : %d\n",nom_fitxer,numero);
		n++;
	    }
	}
	fclose(fit);
    }
    return(n);			/* retorna quants numeros primers ha trobat */
}


int main(int n_args, char * ll_args[])
{
    int i,n,n_total;

    if ((n_args < 2) || (n_args > 11))
    {	fprintf(stderr,"\tus : primos fit1 fit2 ...\t(max 10 fiters)\n");
	exit(1);
    }
    n_total = 0;
    for ( i = 1; i < n_args; i++)
    {
	n = f_primers(ll_args[i]);	/* avaluar primers d'un fitxer */
	if (n >= 0)
	{   printf("numero de primos de \"%s\" : %d\n",ll_args[i],n);
	    n_total += n;	/* acumula el total de primers */
	}
    }
    printf("\nFinalment s'han trobat %d primers!\n\n",n_total);
    return(0);
} 

